package SingleList;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 殇
 * Date: 2025-07-20
 * Time: 22:09
 */
public class MySingleList {

    //定义节点
    static class ListNode{
        public int val;
        public ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }

    public ListNode head;

    public MySingleList() {
        this.head =null;
    }


    //头插法
    public void addFirst(int data){
        ListNode node=new ListNode(data);
        node.next=head;
        head=node;
    }


    //尾插法
    public void addLast(int data){
        ListNode node=new ListNode(data);
        if(head==null){
            head=node;
            return ;
        }
        ListNode cur=head;
        while(cur.next!=null){
            cur=cur.next;
        }
        cur.next=node;
    }

    //任意位置插⼊,第⼀个数据节点为1号下标
    public void addIndex(int index,int data){
        if(index==0)
            addFirst(data);
        if(index<0||index>size()){
            throw new IndexOutOfBoundsException("index错误");
        }
        ListNode node=new ListNode(data);
        ListNode cur=searchIndex(index-1);
        node.next=cur.next;
        cur.next=node;
    }

    //找到index位置的节点
    public ListNode searchIndex(int index){
        if(index<0||index>size())
            return null;
        ListNode cur=head;
        int count=1;
        while(count<index){
            cur=cur.next;
            count++;
        }
        return cur;
    }

    //找到值为key的节点的前一个节点
    public ListNode searchVal(int key){
        ListNode prev=head;
        while(prev.next!=null){
            if(prev.next.val==key){
                return prev;
            }
            prev=prev.next;
        }
        //如果找不到key
        return null;
    }
    //查找是否包含关键字key是否在单链表当中
    public boolean contains(int key){
        ListNode cur=head;
        while(cur!=null){
            if(cur.val==key)
                return true;
            cur=cur.next;
        }
        return false;
    }

    //删除第⼀次出现关键字为key的节点
    public void remove(int key){
        //如果链表无法删除
        if(head==null)
            return ;
        //如果删除的是头节点
        if(head.val==key){
            head=head.next;
            return ;
        }
        ListNode prev=searchVal(key);
        if(prev==null){
            return ;
        }
        ListNode cur=prev.next;
        prev.next=cur.next;
    }


    //删除所有值为key的节点,最简单的方法： 递归
    public void removeAllKey(int key){
        if(head==null)
            return ;
        //未处理头节点
        ListNode prev=head;
        ListNode cur=head.next;
        while(cur!=null){
            if(cur.val==key){
                prev.next=cur.next;
            }
            else{
                prev=cur;
            }
            cur=cur.next;
        }
        //后面均处理完后，再处理头结点
        if(head.val==key)
            head=head.next;
    }

    //得到单链表的⻓度
    public int size(){
        ListNode cur=head;
        int count=0;
        while(cur!=null){
            count++;
            cur=cur.next;
        }
        return count;
    }

    public void clear() {

    }

    public void display() {
        ListNode cur=head;
        while(cur!=null){
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
    }
}
